package com.yangchuang.openpicture.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yangchuang.openpicture.constant.UserStasticsRedisConstants;
import com.yangchuang.openpicture.mapper.UserStatisticsMapper;
import com.yangchuang.openpicture.pojo.UserStatistics;
import com.yangchuang.openpicture.service.UserStatisticsService;
import com.yangchuang.openpicture.util.RedisUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import static com.yangchuang.openpicture.util.ShanghaiTimeUtils.getCurrentTimeStr;

/**
 * 用户统计服务实现类
 * <p>
 * 该服务负责维护用户的统计数据，包括粉丝数、获赞数、收藏数、作品数等。
 * 使用Redis作为缓存层，提高性能，并定期同步到MySQL数据库。
 *
 * @author naiyi
 * @version 1.0
 * @since 2025-09-01
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserStatisticsServiceImpl extends ServiceImpl<UserStatisticsMapper, UserStatistics> implements UserStatisticsService {

    private final RedisUtils redisUtils;

    @Override
    public void UserStatsHashUpdate(Long userId, Boolean viewed, Boolean view,
                                    Boolean liked, Boolean favorited,
                                    Boolean commented, Boolean followed,
                                    Boolean downloaded, Boolean like,
                                    Boolean favorite, Boolean comment, Boolean follow,
                                    Boolean download, Boolean publish) {
        //维护这个主播的各项数据
        String key = UserStasticsRedisConstants.USER_STATS_HASH + userId;
        //还是在判断 这个用户有没有进入这个体系
        //不存在 则初始化

        // 存在时，更新相应的字段值（仅处理非null参数）包括被动的和主动的
        //相同的逻辑 不存在的话 导致被触发 -->相应的那个传进来的参数肯定是true  把设为1 变成1=0+1 且会自动创建
        //1.更新时间 相同的操作
        redisUtils.hashOps().setFieldValue(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_UPDATE_TIME, getCurrentTimeStr());
        // 存在时，更新相应的字段值（仅处理非null参数） 不存在呢？？代表因为某个动作 引起了 初始化 这个动作对应的参数肯定不是null 肯定是true 所以会增加1 （默认是0） 且会自动创建
        // 被动作相关统计（他人对当前用户的操作）
        if (followed != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_FANS_COUNT, followed ? 1 : -1);
        }
        if (liked != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_TOTAL_LIKES, liked ? 1 : -1);
        }
        if (favorited != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_TOTAL_FAVORITES, favorited ? 1 : -1);
        }
        if (commented != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_TOTAL_COMMENTS, commented ? 1 : -1);
        }
        if (downloaded != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_TOTAL_DOWNLOADS, downloaded ? 1 : -1);
        }

        // 主动作相关统计（当前用户对他人的操作）
        if (follow != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_FOLLOWING_COUNT, follow ? 1 : -1);
        }
        if (favorite != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_FAVORITES_COUNT, favorite ? 1 : -1);
        }
        if (download != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_DOWNLOADS_COUNT, download ? 1 : -1);
        }

        if (comment != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_TOTAL_COMMENTS_COUNT, comment ? 1 : -1);
        }
        if (like != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_LIKES_COUNT, like ? 1 : -1);
        }
        if (publish != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_TOTAL_WORKS_COUNT, publish ? 1 : -1);

        }
        //下面这两个字段，除非是不存在去初始化的时候，不然的话，不管是哪个行为出发了用户的统计数据更新， 只多不少
        //都至少有一个为true
        if (viewed != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_GET_TOTAL_VIEWS, 1);
        }

        if (view != null) {
            redisUtils.hashOps().incrementFieldBy(key, UserStasticsRedisConstants.USER_STATS_HASH_FIELD_OWN_VIEWS_COUNT, 1);
        }

        //主动将变化的 userId 上报到脏数据集合
        redisUtils.setOps().addMembers(UserStasticsRedisConstants.USER_STATS_DIRTY_SET, String.valueOf(userId));
    }

}
